/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package brain.interprete;

import brain.mapa.*;

/**
 *
 * @author Luis Valdeavellano, 11218
 */
public class Robot {
    private Coordenada coord;
    private int direccion;
    private int galletas;

    /**
     * Constructor.
     * Coloca al robot en la coordenada (0,0) y la direccion "right"
     */
    public Robot(){
        coord = new Coordenada(0,0);
        direccion = toCode("right");
        galletas = 0;
    }
    
    /**
     * Constructor.
     * Coloca el robot en la direccion "right"
     * @param coordenada Coordenada para posicionar al robot
     */
    public Robot(Coordenada coordenada){
        coord = coordenada;
        direccion = toCode("right");
        galletas = 0;
    }
    
    /**
     * Constructor
     * @param coordenada Coordenada para posicionar al robot
     * @param direccion puede ser "right", "down", "left" or "up"
     */
    public Robot(Coordenada coordenada, String direccion){
        coord = coordenada;
        this.direccion = toCode(direccion);
        galletas = 0;
    }
    
    /**
     * Convierte el string de direccion en un int que lo representa
     * @param dir
     * @return
     */
    private int toCode(String dir){
        if (dir.equals("right")) return 0;
        else if (dir.equals("down")) return 1;
        else if (dir.equals("left")) return 2;
        else if (dir.equals("up")) return 3;
        else return -1;
    }
    
    /**
     * Mueve al robot un paso hacia la direccion del mismo
     */
    public void move(){
        switch (direccion){
            case 0: coord.setX(coord.getX()+1); break;
            case 2: coord.setX(coord.getX()-1); break;
            case 3: coord.setY(coord.getY()-1); break;
            case 1: coord.setY(coord.getY()+1); break;
        }
    }
    
    /**
     * Gira al robot en el sentido de las agujas del reloj
     */
    public void girar(){
        switch (direccion){
            case 0: setDireccion("down"); break;
            case 2: setDireccion("up"); break;
            case 3: setDireccion("right"); break;
            case 1: setDireccion("left"); break;
        }
    }
    
    /**
     * Gira al robot tantos cuadrantes en el sentido del reloj
     * @param cuad cantidad de cuadrantes que va a girar
     */
    public void girar(int cuad){
        while (cuad>0){
            girar();
            cuad--;
        }
    }
    
    /**
     * @return the coord
     */
    public Coordenada getCoord() {
        return coord;
    }

    /**
     * @param coord the coord to set
     */
    public void setCoord(Coordenada coord) {
        this.coord = coord;
    }

    /**
     * @return the direccion
     */
    public String getDireccion() {
        switch (direccion){
            case 0: return "right";
            case 1: return "down";
            case 2: return "left";
            case 3: return "up";
            default: return null;
        }
    }

    /**
     * @param direccion the direccion to set
     */
    public void setDireccion(String direccion) {
        this.direccion = toCode(direccion);
    }

    /**
     * @return the galletas
     */
    public int getGalletas() {
        return galletas;
    }

    /**
     * incrementa el numero de galletas comidas
     */
    public void comer() {
        galletas++;
    }
    
    /**
     * Retorna la coordenada de la posición que se encuentra enfrente del robot
     * @return coordenada
     */
    public Coordenada getEnfrente(){
        Coordenada coord = new Coordenada(this.coord.getX(), this.coord.getY());
        switch (direccion){
            case 0: coord.setX(coord.getX()+1); break;
            case 2: coord.setX(coord.getX()-1); break;
            case 3: coord.setY(coord.getY()-1); break;
            case 1: coord.setY(coord.getY()+1); break;
        }
        return coord;
        // TODO: si enfrente es el limite del mapa, la coordenada que esta devolviendo es la misma que de donde esta
    }
}
